/**
* jqFancyTransitions - jQuery plugin
* @version: 1.8 (2010/06/13)
* @requires jQuery v1.2.2 or later 
* @author Ivan Lazarevic
* Examples and documentation at: http://www.workshop.rs/projects/jqfancytransitions
 
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
**/

(function ($) {
    var opts = new Array;
    var level = new Array;
    var img = new Array;
    var links = new Array;
    var titles = new Array;
    var order = new Array;
    var imgInc = new Array;
    var inc = new Array;
    var stripInt = new Array;
    var imgInt = new Array;

    $.fn.jqFancyTransitions = $.fn.jqfancytransitions = function (options) {

        init = function (el) {

            opts[el.id] = $.extend({}, $.fn.jqFancyTransitions.defaults, options);
            img[el.id] = new Array(); // images array
            links[el.id] = new Array(); // links array
            titles[el.id] = new Array(); // titles array
            order[el.id] = new Array(); // strips order array
            imgInc[el.id] = 0;
            inc[el.id] = 0;

            params = opts[el.id];

            if (params.effect == 'zipper') { params.direction = 'alternate'; params.position = 'alternate'; }
            if (params.effect == 'wave') { params.direction = 'alternate'; params.position = 'top'; }
            if (params.effect == 'curtain') { params.direction = 'alternate'; params.position = 'curtain'; }

            // width of strips
            stripWidth = parseInt(params.width / params.strips);
            gap = params.width - stripWidth * params.strips; // number of pixels
            stripLeft = 0;

            // create images and titles arrays
            $.each($('#' + el.id + ' img'), function (i, item) {
                img[el.id][i] = $(item).attr('src');
                links[el.id][i] = $(item).next().attr('href');
                titles[el.id][i] = $(item).attr('alt') ? $(item).attr('alt') : '';
                $(item).hide();
            });

            // set panel
            $('#' + el.id).css({
                'background-image': 'url(' + img[el.id][0] + ')',
                'width': params.width,
                'height': params.height,
                'position': 'relative',
                'background-position': 'top left'
            });

            // create title bar
            $('#' + el.id).append("<div class='ft-title' id='ft-title-" + el.id + "' style='position: absolute; bottom:0; left: 0; z-index: 1000; color: #fff; background-color: #000; '>" + titles[el.id][0] + "</div>");
            if (titles[el.id][imgInc[el.id]])
                $('#ft-title-' + el.id).css('opacity', opts[el.id].titleOpacity);
            else
                $('#ft-title-' + el.id).css('opacity', 0);

            if (params.navigation) {
                $.navigation(el);
                $('#ft-buttons-' + el.id).children().first().addClass('ft-button-' + el.id + '-active');
            }

            odd = 1;
            // creating bars
            // and set their position
            for (j = 1; j < params.strips + 1; j++) {

                if (gap > 0) {
                    tstripWidth = stripWidth + 1;
                    gap--;
                } else {
                    tstripWidth = stripWidth;
                }

                if (params.links)
                    $('#' + el.id).append("<a href='" + links[el.id][0] + "' class='ft-" + el.id + "' id='ft-" + el.id + j + "' style='width:" + tstripWidth + "px; height:" + params.height + "px; float: left; position: absolute;outline:none;'></a>");
                else
                    $('#' + el.id).append("<div class='ft-" + el.id + "' id='ft-" + el.id + j + "' style='width:" + tstripWidth + "px; height:" + params.height + "px; float: left; position: absolute;'></div>");

                // positioning bars
                $("#ft-" + el.id + j).css({
                    'background-position': -stripLeft + 'px top',
                    'left': stripLeft
                });

                stripLeft += tstripWidth;

                if (params.position == 'bottom')
                    $("#ft-" + el.id + j).css('bottom', 0);

                if (j % 2 == 0 && params.position == 'alternate')
                    $("#ft-" + el.id + j).css('bottom', 0);

                // bars order
                // fountain
                if (params.direction == 'fountain' || params.direction == 'fountainAlternate') {
                    order[el.id][j - 1] = parseInt(params.strips / 2) - (parseInt(j / 2) * odd);
                    order[el.id][params.strips - 1] = params.strips; // fix for odd number of bars
                    odd *= -1;
                } else {
                    // linear
                    order[el.id][j - 1] = j;
                }

            }

            $('.ft-' + el.id).mouseover(function () {
                opts[el.id].pause = true;
            });

            $('.ft-' + el.id).mouseout(function () {
                opts[el.id].pause = false;
            });

            $('#ft-title-' + el.id).mouseover(function () {
                opts[el.id].pause = true;
            });

            $('#ft-title-' + el.id).mouseout(function () {
                opts[el.id].pause = false;
            });

            clearInterval(imgInt[el.id]);
            imgInt[el.id] = setInterval(function () { $.transition(el) }, params.delay + params.stripDelay * params.strips);

        };

        // transition
        $.transition = function (el, direction) {

            if (opts[el.id].pause == true) return;

            stripInt[el.id] = setInterval(function () { $.strips(order[el.id][inc[el.id]], el) }, opts[el.id].stripDelay);

            $('#' + el.id).css({ 'background-image': 'url(' + img[el.id][imgInc[el.id]] + ')' });

            if (typeof (direction) == "undefined")
                imgInc[el.id]++;
            else
                if (direction == 'prev')
                    imgInc[el.id]--;
                else
                    imgInc[el.id] = direction;

            if (imgInc[el.id] == img[el.id].length) {
                imgInc[el.id] = 0;
            }

            if (imgInc[el.id] == -1) {
                imgInc[el.id] = img[el.id].length - 1;
            }

            if (titles[el.id][imgInc[el.id]] != '') {
                $('#ft-title-' + el.id).animate({ opacity: 0 }, opts[el.id].titleSpeed, function () {
                    $(this).html(titles[el.id][imgInc[el.id]]).animate({ opacity: opts[el.id].titleOpacity }, opts[el.id].titleSpeed);
                });
            } else {
                $('#ft-title-' + el.id).animate({ opacity: 0 }, opts[el.id].titleSpeed);
            }

            inc[el.id] = 0;

            buttons = $('#ft-buttons-' + el.id).children();

            buttons.each(function (index) {
                if (index == imgInc[el.id]) {
                    $(this).addClass('ft-button-' + el.id + '-active');
                } else {
                    $(this).removeClass('ft-button-' + el.id + '-active');
                }
            });

            if (opts[el.id].direction == 'random')
                $.fisherYates(order[el.id]);

            if ((opts[el.id].direction == 'right' && order[el.id][0] == 1)
			|| opts[el.id].direction == 'alternate'
			|| opts[el.id].direction == 'fountainAlternate')
                order[el.id].reverse();
        };


        // strips animations
        $.strips = function (itemId, el) {

            temp = opts[el.id].strips;
            if (inc[el.id] == temp) {
                clearInterval(stripInt[el.id]);
                return;
            }
            $('.ft-' + el.id).attr('href', links[el.id][imgInc[el.id]]);
            if (opts[el.id].position == 'curtain') {
                currWidth = $('#ft-' + el.id + itemId).width();
                $('#ft-' + el.id + itemId).css({ width: 0, opacity: 0, 'background-image': 'url(' + img[el.id][imgInc[el.id]] + ')' });
                $('#ft-' + el.id + itemId).animate({ width: currWidth, opacity: 1 }, 1000);
            } else {
                $('#ft-' + el.id + itemId).css({ height: 0, opacity: 0, 'background-image': 'url(' + img[el.id][imgInc[el.id]] + ')' });
                $('#ft-' + el.id + itemId).animate({ height: opts[el.id].height, opacity: 1 }, 1000);
            }

            inc[el.id]++;

        };

        // navigation
        $.navigation = function (el) {
            // create prev and next 
            $('#' + el.id).append("<a href='#' id='ft-prev-" + el.id + "' class='ft-prev'>prev</a>");
            $('#' + el.id).append("<a href='#' id='ft-next-" + el.id + "' class='ft-next'>next</a>");
            $('#ft-prev-' + el.id).css({
                'position': 'absolute',
                'top': params.height / 2 - 15,
                'left': 0,
                'z-index': 1001,
                'line-height': '30px',
                'opacity': 0.7
            }).click(function (e) {
                e.preventDefault();
                $.transition(el, 'prev');
                clearInterval(imgInt[el.id]);
                imgInt[el.id] = setInterval(function () { $.transition(el) }, params.delay + params.stripDelay * params.strips);
            });

            $('#ft-next-' + el.id).css({
                'position': 'absolute',
                'top': params.height / 2 - 15,
                'right': 0,
                'z-index': 1001,
                'line-height': '30px',
                'opacity': 0.7
            }).click(function (e) {
                e.preventDefault();
                $.transition(el);
                clearInterval(imgInt[el.id]);
                imgInt[el.id] = setInterval(function () { $.transition(el) }, params.delay + params.stripDelay * params.strips);
            });

            // image buttons
            $("<div id='ft-buttons-" + el.id + "'></div>").insertAfter($('#' + el.id));
            $('#ft-buttons-' + el.id).css({
                'text-align': 'right',
                'padding-top': 5,
                'width': opts[el.id].width
            });
            for (k = 1; k < img[el.id].length + 1; k++) {
                $('#ft-buttons-' + el.id).append("<a href='#' class='ft-button-" + el.id + "'>" + k + "</a>");
            }
            $('.ft-button-' + el.id).css({
                'padding': 5
            });

            $.each($('.ft-button-' + el.id), function (i, item) {
                $(item).click(function (e) {
                    e.preventDefault();
                    $.transition(el, i);
                    clearInterval(imgInt[el.id]);
                    imgInt[el.id] = setInterval(function () { $.transition(el) }, params.delay + params.stripDelay * params.strips);
                })
            });
        }



        // shuffle array function
        $.fisherYates = function (arr) {
            var i = arr.length;
            if (i == 0) return false;
            while (--i) {
                var j = Math.floor(Math.random() * (i + 1));
                var tempi = arr[i];
                var tempj = arr[j];
                arr[i] = tempj;
                arr[j] = tempi;
            }
        }

        this.each(
		function () { init(this); }
	);

    };

    // default values
    $.fn.jqFancyTransitions.defaults = {
        width: 400, // width of panel
        height: 332, // height of panel
        strips: 10, // number of strips
        delay: 5000, // delay between images in ms
        stripDelay: 50, // delay beetwen strips in ms
        titleOpacity: 0.7, // opacity of title
        titleSpeed: 1000, // speed of title appereance in ms
        position: 'alternate', // top, bottom, alternate, curtain
        direction: 'fountainAlternate', // left, right, alternate, random, fountain, fountainAlternate
        effect: '', // curtain, zipper, wave
        navigation: false, // prev next and buttons
        links: false // show images as links 		
    };

})(jQuery);